package de.gof.ppstool.util;

import static de.gof.ppstool.util.LogUtil.begin;
import static de.gof.ppstool.util.LogUtil.end;
import static de.gof.ppstool.util.LogUtil.LOGEMCREATED;
import static de.gof.ppstool.util.LogUtil.LOGEMCLOSED;
import static de.gof.ppstool.util.LogUtil.LOGEMREUSED;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import de.gof.ppstool.bestellverwaltung.Bestellverwaltung;
import de.gof.ppstool.bestellverwaltung.IBestellverwaltung;
import de.gof.ppstool.bestellverwaltung.db.BestellverwaltungDAO;
import de.gof.ppstool.bestellverwaltung.db.IBestellverwaltungDAO;
import de.gof.ppstool.fertigungsverwaltung.Fertigungsverwaltung;
import de.gof.ppstool.fertigungsverwaltung.IFertigungsverwaltung;
import de.gof.ppstool.fertigungsverwaltung.db.FertigungsverwaltungDAO;
import de.gof.ppstool.fertigungsverwaltung.db.IFertigungsverwaltungDAO;
import de.gof.ppstool.kundenauftragsverwaltung.IKundenauftragsverwaltung;
import de.gof.ppstool.kundenauftragsverwaltung.Kundenauftragsverwaltung;
import de.gof.ppstool.kundenauftragsverwaltung.db.IKundenauftragsverwaltungDAO;
import de.gof.ppstool.kundenauftragsverwaltung.db.KundenauftragsverwaltungDAO;
import de.gof.ppstool.lagerverwaltung.ILagerverwaltung;
import de.gof.ppstool.lagerverwaltung.Lagerverwaltung;
import de.gof.ppstool.lagerverwaltung.db.ILagerverwaltungDAO;
import de.gof.ppstool.lagerverwaltung.db.LagerverwaltungDAO;

public class GofUtil {
	private static final Log LOG = LogFactory.getLog(GofUtil.class);
	private static final boolean DEBUG = LOG.isDebugEnabled();
	private static final String PERSISTENCE_UNIT = "PPSJPA";
	private static EntityManagerFactory emf;
	private static EntityManager em;

	private GofUtil() {
	}

	public static void init() {
		if (DEBUG)
			begin(LOG);

		emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
		final String logMsg = LOGEMCREATED;
		LOG.info(logMsg);
		if (DEBUG)
			end(LOG);

	}

	/** 
	 */

	public static void shutdown() {
		if (DEBUG)
			begin(LOG);

		if (emf != null) {
			emf.close();
			emf = null;
		}

		final String logMsg = LOGEMCLOSED;
		LOG.info(logMsg);
		if (DEBUG)
			end(LOG);

	}

	/** 
	 */

	public static void createEntityManager() {
		if (DEBUG)
			begin(LOG);

		assert emf != null;
		em = emf.createEntityManager();
		if (DEBUG) {
			final String logMsg = LOGEMCREATED;
			end(LOG, logMsg);
		}

	}

	/** 
	 */

	public static void closeEntityManager() {
		if (DEBUG)
			begin(LOG);

		if (em != null) {
			em.close();
			em = null;
		}

		if (DEBUG)
			end(LOG);

	}

	/** 
	 */

	public static EntityManager getEntityManager() {
		if (DEBUG)
			begin(LOG);

		assert em != null;
		if (DEBUG) {
			final String logMsg = LOGEMREUSED;
			end(LOG, logMsg);
		}

		return em;
	}

	public static ILagerverwaltungDAO getLagerverwaltungDao() {
		return new LagerverwaltungDAO();
	}

	public static IFertigungsverwaltungDAO getFertigungsverwaltungDao() {
		return new FertigungsverwaltungDAO();
	}

	public static IBestellverwaltungDAO getBestellverwaltungDao() {
		return new BestellverwaltungDAO();
	}

	public static IKundenauftragsverwaltungDAO getKundenauftragsverwaltungDao() {
		return new KundenauftragsverwaltungDAO();
	}

	public static ILagerverwaltung getLagerverwaltung() {
		return new Lagerverwaltung();
	}

	public static IKundenauftragsverwaltung getKundenauftragsverwaltung() {
		return new Kundenauftragsverwaltung();
	}

	public static IBestellverwaltung getBestellverwaltung() {
		return new Bestellverwaltung();
	}

	public static IFertigungsverwaltung getFertigungsverwaltung() {
		return new Fertigungsverwaltung();
	}

}
